package com.dongdong.service.impl;

import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
import com.dongdong.mapper.TbItemCatMapper;
import com.dongdong.mapper.TbSpecificationOptionMapper;
import com.dongdong.mapper.TbTypeTemplateMapper;
import com.dongdong.model.TbItemCat;
import com.dongdong.model.TbSpecificationOption;
import com.dongdong.model.TbTypeTemplate;
import com.dongdong.model.TbTypeTemplateExample;
import com.dongdong.service.TypeTemplateService;
import com.dongdong.utils.PageBean;
import com.dongdong.utils.PageResult;
import com.dongdong.vo.SpecOptionVO;
import com.dongdong.vo.SpecVO;
import com.dongdong.vo.TypeTemplateVO;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;


@Service
public class TypeTemplateServiceImpl implements TypeTemplateService {

    @Autowired
    private TbTypeTemplateMapper typeTemplateMapper;

    @Autowired
    private TbItemCatMapper itemCatMapper;

    @Autowired
    private TbSpecificationOptionMapper specOptionMapper;

    @Override
    public PageResult<TypeTemplateVO> getTypeTemplatePage(PageBean<TypeTemplateVO> typeTemplateVO) {

        TbTypeTemplateExample example = new TbTypeTemplateExample();
        TbTypeTemplateExample.Criteria criteria = example.createCriteria();
        if (!StrUtil.isEmpty(typeTemplateVO.getParams().getName())){
            criteria.andNameLike("%"+typeTemplateVO.getParams().getName()+"%");
        }

//        分页
        PageHelper.startPage(typeTemplateVO.getPageNum(),typeTemplateVO.getPageSize());
        List<TbTypeTemplate> typeTemplateList = typeTemplateMapper.selectByExample(example);
        PageInfo<TbTypeTemplate> info = new PageInfo<>(typeTemplateList);

        List<TypeTemplateVO> voList = typeTemplateList.stream().map((x) -> {
            TypeTemplateVO vo = new TypeTemplateVO();
            BeanUtils.copyProperties(x, vo);
            return vo;
        }).collect(Collectors.toList());

        return new PageResult<>(info.getPageNum(),info.getPageSize(),info.getTotal(),voList);
    }

    @Override
    public TypeTemplateVO getTypeTemplateById(Long id) {
        TbTypeTemplate typeTemplate = typeTemplateMapper.selectByPrimaryKey(id);
        TypeTemplateVO vo = new TypeTemplateVO();
        BeanUtils.copyProperties(typeTemplate,vo);
        return vo;
    }

    @Override
    public void deleteTypeTemplateById(Long id) {
//
        typeTemplateMapper.deleteByPrimaryKey(id);

    }

    @Override
    public void updateTypeTemplate(TypeTemplateVO typeTemplateVO) {
        TbTypeTemplate template = new TbTypeTemplate();
        BeanUtils.copyProperties(typeTemplateVO,template);
        typeTemplateMapper.updateByPrimaryKeySelective(template);
    }

    @Override
    public void addTypeTemplate(TypeTemplateVO typeTemplateVO) {
        TbTypeTemplate template = new TbTypeTemplate();
        BeanUtils.copyProperties(typeTemplateVO,template);
        typeTemplateMapper.insertSelective(template);
    }

    @Override
    public TypeTemplateVO getTypeTemplateByTypeId(Long id) {
//        根据分类id 查询typeId
        TbItemCat itemCat = itemCatMapper.selectByPrimaryKey(id);
//        根据typeId查询模板对象
        TbTypeTemplate typeTemplate = typeTemplateMapper.selectByPrimaryKey(itemCat.getTypeId());
        TypeTemplateVO vo = new TypeTemplateVO();
        BeanUtils.copyProperties(typeTemplate,vo);

//       转成规格集合
        List<SpecVO> specVOS = JSONObject.parseArray(vo.getSpecIds(), SpecVO.class);
        vo.setSpecVOS(specVOS);

        List<TbSpecificationOption> specOptionList = specOptionMapper.selectByExample(null);

        List<SpecOptionVO> specOptionVOS = specOptionList.stream().map((x) -> {
            SpecOptionVO specOptionVO = new SpecOptionVO();
            BeanUtils.copyProperties(x, specOptionVO);
            return specOptionVO;
        }).collect(Collectors.toList());

        Map<Long, List<SpecOptionVO>> specOptionMap = specOptionVOS.stream().collect(Collectors.groupingBy((x) -> {
            return x.getSpecId();
        }));


        for (SpecVO specVO : specVOS) {
            List<SpecOptionVO> specOptionVOList = specOptionMap.get(specVO.getId());
            specVO.setOptionVOS(specOptionVOList);
        }

        return vo;
    }
}
